home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 331_01 / ged1.c < prev    next >
Text File  |  1990-06-12  |  11KB  |  424 lines

  1. /*
  2. HEADER:         CUG999.02;
  3. TITLE:          GED (nee QED) screen editor -- part 1;
  4. DATE:           05/19/87;
  5.  
  6. DESCRIPTION:    "Disc directory and option selection for SE.";
  7.  
  8. SYSTEM:         MS-DOS;
  9. FILENAME:       GED1.C;
  10. AUTHORS:        G. Nigel Gilbert, James W. Haefner, Mel Tearle, G. Osborn;
  11. COMPILERS:      DeSmet C;
  12. */
  13.  
  14. /*
  15.      e/qed/ged  screen editor
  16.  
  17.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  18.            August-December 1981
  19.  
  20.     Modified:  Aug-Dec   1984:  BDS-C 'e'(vers 4.6a) to 'qed' (J.W.Haefner)
  21.                March     1985:  BDS-C 'qed' to DeSmet-C 'qed' (J.W.Haefner)
  22.                May       1986:  converted to ged - Mel Tearle
  23.  
  24.     FILE:      qed1.c
  25.  
  26.     FUNCTIONS: dirmsk, printdirectory, envir, files, putonoff,
  27.                getnumb, getlow
  28.  
  29.     PURPOSE:   environment; change files.
  30.  
  31. */
  32.  
  33. #include <stdio.h>
  34. #include "ged.h"
  35.  
  36. #define EXTENT   12
  37. #define RECORDS  15
  38. #define EXTSIZ  128
  39.  
  40.  
  41. /* in MSDOS 2.x just pass the string to showdir
  42.  * maintain dirmsk call for other functions
  43.  */
  44. dirmsk()
  45. {
  46.     char *pattp;
  47.  
  48.     pattp = patt;
  49.     if ( scans( patt, FILELEN ) == ESCKEY )
  50.         return  YES;
  51.     if ( !*pattp )
  52.         pattp = "*.*";
  53.     showdir( pattp );
  54. }
  55.  
  56.  
  57. /* show msdos directory from ambiguous mask
  58.  * assumes vers.2.x, allows path names
  59.  */
  60. showdir(msk)
  61. char *msk;
  62. {
  63.     unsigned char getkey();
  64.     char  dtabuf[43], *dirsp, curdir[64], *curdirp;
  65.     char  *bufp, first, driven, drivel, entriesonline, a, c;
  66.     long  fsize, *sizep, used, free;
  67.     int   x, y, i;
  68.  
  69. /* init display */
  70.     cleareop(0);
  71. /* has a drive been specified?
  72.          */
  73.     for ( i = 0; ( (c = msk[i++] ) && ( c != ':' ) ); );
  74.     if ( c )  {
  75.         drivel = toupper( msk[(i-=2)] );
  76.         {
  77.             if ( ( ( driven = drivel-'A' ) < 0 ) || ( driven > 15 ) )  {
  78.                 driven = curdsk;
  79.                 drivel = driven+'A';
  80.             }
  81.         }
  82.     }
  83.     else  {
  84.         driven = curdsk;
  85.         drivel = driven+'A';
  86.     }
  87.  
  88.     curdirp  = curdir;
  89.     *curdirp = 0;
  90.     gotoxy( 0, 6 );
  91.     if ( getpath( curdirp, ( driven+1 ) ) == FAIL )
  92.         return  NO;
  93.     putstr( "Directory of " );
  94.     dispch( drivel );
  95.     putstr( ":\\" );
  96.     putstr( curdirp );
  97.  
  98.     if ( curdsk != ( driven ) && seldisk( driven ) != FAIL )  {
  99.         putstr( "  (default drive is " );
  100.         putch( curdsk+'A' );
  101.         putstr( ":)" );
  102.     }
  103.  
  104. /* get disk free space
  105.            */
  106.     rax = ( 0x36 << 8 );
  107.     rds = -1;
  108.     rdx = driven + 1;
  109.     rcx = 0x00;
  110.     syscall();
  111.     if ( rax == 0xffff )  {
  112.         error( " Bad drive " );
  113.         return( rax );
  114.     }
  115.  
  116.     free = (long) rax * rbx * rcx;
  117.     cleareol( ( x = 2 ), ( y = 8 ) );
  118.     dirsp = "=dir";
  119.     entriesonline = 0;
  120.     used = 0;
  121.  
  122.     for ( i = 0; i < 43; i++ )
  123.         dtabuf[i] = 0;
  124. /* set disk dma transfer address.  small data model */
  125.     rdx = (unsigned int) dtabuf;
  126.     rax = 0x1A << 8;
  127.     syscall();
  128.  
  129.     first = TRUE;
  130.  
  131.     do  {
  132.         rax = ( (first) ? ( 0x4e << 8 ) : ( 0x4f << 8 ) ); /* find first & next */
  133.         rdx = (unsigned int) msk;             /* point to path */
  134.         rds = -1;              /* use current ds */
  135.         rcx = 0x30;            /* show normal, dir and archived files */
  136.         syscall();
  137.         if ( rax == 2 )  {     /* bad path */
  138.             error(" Bad path ");
  139.             return  NO;
  140.         }
  141.         if ( ( rax != 18 ) )  {   /* name is found */
  142.             color1();
  143.             first = FALSE;
  144.             sizep = (long *) &dtabuf[0x1a];
  145.             fsize = *sizep;
  146.             used += fsize;
  147.             bufp  = &dtabuf[0x1e];
  148.             putstr( bufp );
  149.             if ( dtabuf[0x15] == 0x10 )  putstr( dirsp );  /* entry is directory */
  150. /* put code to show if archive bit set, here
  151.                                  */
  152.             if ( ( ++entriesonline < 5 ) )
  153.                 gotoxy( ( x += 15 ), y );
  154.             else  {
  155.                 cleareol( ( x = 2 ), ++y );
  156.                 if ( y == SHEIGHT )  {
  157.                     putstr( "[|<cr>| for MORE...]" );
  158.                     a = getkey();
  159.                     if ( ( a == ESCKEY ) || ( a == F9KEY ) )  return  ESCKEY;
  160.                     color1();
  161.                     cleareop( ( y = 8 ) );
  162.                     gotoxy( ( x = 2 ), y );
  163.                 }
  164.                 entriesonline = 0;
  165.             }
  166.         }
  167.     }
  168.     while ( ( rax != 18 ) );
  169.  
  170.     gotoxy( 0, SHEIGHT );
  171.     putstr( "Total Bytes Free = " );
  172.     uspr( 0, free, ATTR0);
  173.     putstr( "   Used = " );
  174.     uspr( 0, used, ATTR0 );
  175.     if ( curdsk != driven )  seldisk( curdsk );
  176.     color1();
  177.     gotoxy( 0, 0 );
  178.     return ( rax );
  179. }
  180.  
  181.  
  182. envir()
  183. {
  184.     char   c;
  185.     long jj;
  186.     char buf[81];
  187.  
  188.     puttext();
  189.     do {
  190.         cleareop(0);
  191.         putstatusline(cline);
  192.         gotoxy(0,2);
  193.         putstr("Program options:\n\n");
  194.         putstr("  enter |F| for files\n\n");
  195.  
  196.         putstr("|A|uto indent:                  ");
  197.         putonoff(autoin);
  198.  
  199.         putstr("|B|ack up original              ");
  200.         putonoff(backup);
  201.  
  202.         putstr("|C|trl codes OK                 ");
  203.         putonoff(ctrl);
  204.  
  205.         sprintf(buf,"temp. |D|isc drive               %c:\n",pagingfile[0]);
  206.         putstr(buf);
  207.  
  208.         putstr("|H|orizontal scroll all lines   ");
  209.         putonoff(blockscroll);
  210.  
  211.         putstr("|P|arity=0. (import wordstar).  ");
  212.         putonoff(charmask == 0x7F);
  213.  
  214.         sprintf(buf,"|M|em use allowed               %d kb\n",fullmem);
  215.         putstr(buf);
  216.  
  217.         sprintf(buf,"|T|ab setting                     %d\n",tabwidth);
  218.         putstr(buf);
  219.  
  220.         putstr("|S|trip trailing blanks,tabs    ");
  221.         putonoff(!trail);
  222.  
  223.         putstr("^|Z| at end of output file      ");
  224.         putonoff(eofchar);
  225.  
  226.         jj = (long) (slotsinmem-2)*(PAGESIZE/(sizeof(*tp)));
  227.         if (jj > 16383L)
  228.             jj = 16383L;   /* really a little more */
  229.         sprintf(buf,"\nMemory allows %ld lines of text\n",jj);
  230.         putstr(buf);
  231.  
  232.         putstr("Use -A -M99 etc. to set options at load time\n");
  233. agn:
  234.         gotoxy(0,19);
  235.         putstr("Enter capital letter to change, |<esc>| to return: ");
  236.  
  237.         switch( (c = getlow()) )  {
  238.         case 'a':
  239.             autoin = !autoin;
  240.             break;
  241.         case 'b':
  242.             backup = !backup;
  243.             break;
  244.         case 'c':
  245.             ctrl = !ctrl;
  246.             break;
  247.         case 'h':
  248.             blockscroll = !blockscroll;
  249.             break;
  250.         case 't':
  251.             putstr( "\n\nEnter new |tab width|: " );
  252.             if ( !( tabwidth = getnumb()) )
  253.                 tabwidth = 1;
  254.             break;
  255.         case 's':
  256.             trail = !trail;
  257.             break;
  258.         case 'f':
  259.             if ( files() )
  260.                 goto escape;
  261.             break;
  262.         case 'z':
  263.             eofchar = !eofchar;
  264.             break;
  265.         case 'p':
  266.         case 'm':
  267.         case 'd':
  268.             putstr("Must be specified at load time.");
  269.             goto agn;
  270.             break;
  271.         case ESCKEY:
  272.             goto escape;
  273.         }
  274.     }
  275.     while (YES);
  276. escape:
  277.     cleareop(0);
  278.     topline = 1;  /* help off if on */
  279.     calp();
  280.     putpage();
  281.     putstatusline( cline );
  282. }
  283.  
  284.  
  285. getpath(curdirp,drvnum)
  286. char *curdirp;
  287. int drvnum;
  288. {
  289.     rax = ( 0x47 << 8 );       /* get directory */
  290.     rsi = (unsigned int) curdirp;
  291.     rdx = drvnum;
  292.     syscall();
  293.     if ( ( carryf ) && ( rax == 0x15 ) )  {
  294.         error( "Bad drive" );
  295.         return  FAIL;
  296.     }
  297.     return  YES;
  298. }
  299.  
  300.  
  301. files()
  302. {
  303.     char oldname[15], newname[15], dc, c;
  304.     char curdir[64], *curdirp, *tp1;
  305.     int  dir;
  306.  
  307.     do  {
  308.         cleareop(0);
  309.         putstatusline( cline );
  310. newcomm:
  311.         dir = curdsk;
  312.         gotoxy( 0, 1 );
  313.         putstr( "Enter |Q| to return to Edit context     |D| to delete a file\n" );
  314.         putstr( "      |R| to rename a file  |P| to change/show path  |>| to view directory  \n" );
  315.         cleareol( 0, 3 );
  316.         putstr( "      |C| to change